iT邦幫忙

2025 iThome 鐵人賽

DAY 8
1
DevOps

牧場主的 K8s 放牧日記系列 第 8

Day 8: SSL 憑證申請與設定 - Let's Encrypt 免費 SSL 憑證

  • 分享至 

  • xImage
  •  

牧場主今日工作

昨天我們為數位牧場申請了門牌地址,今天要為這個門牌安裝安全鎖!現在網路世界裡,沒有 HTTPS 的網站就像沒有鎖的大門,瀏覽器會狂發警告,用戶也不敢進來。幸好 Let's Encrypt 提供免費的 SSL 憑證,讓我們的牧場也能擁有五星級的安全防護!

技術背景與概念

什麼是 Let's Encrypt?

https://ithelp.ithome.com.tw/upload/images/20250823/20141794CJYmvLP0if.png

Let's Encrypt 是一個免費、自動化、開放的憑證頒發機構(Certificate Authority, CA),由非營利組織 Internet Security Research Group (ISRG) 營運。

Let's Encrypt 的特點:

  • 完全免費:不收取任何費用
  • 自動化:可以透過 ACME 協議自動申請和更新憑證
  • 開放:開源且透明的操作方式
  • 廣泛信任:所有主要瀏覽器都信任 Let's Encrypt 憑證
  • 有效期 90 天:鼓勵自動化更新,提升安全性

核心概念說明

在我們的設定中:

  • Let's Encrypt:提供免費 SSL 憑證的機構
  • DuckDNS:免費的動態 DNS 服務,提供子域名
  • Certbot:用來與 Let's Encrypt 互動的客戶端工具
  • ACME 協議:自動化憑證管理環境協議

Certbot 安裝與設定

在 Ubuntu 上安裝 Certbot

# 更新套件清單
sudo apt update

# 安裝 Certbot
sudo apt install -y certbot

# 如果需要 DNS 插件,可以安裝(選用)
pip3 install certbot-dns-duckdns

申請 SSL 憑證

使用 DNS 挑戰模式申請憑證

# 申請 SSL 憑證
sudo certbot certonly \
  --manual \
  --preferred-challenges dns \
  --email your-email@example.com \
  --agree-tos \
  -d "ithome-rancher.duckdns.org"

處理 DNS 挑戰驗證

當執行上述指令時,Let's Encrypt 會要求你完成 DNS 挑戰:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for ithome-rancher.duckdns.org

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:

_acme-challenge.ithome-rancher.duckdns.org.

with the following value:

ABC123def456GHI789jkl012MNO345pqr678STU901vwx

Before continuing, verify the TXT record has been deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue

設定 DuckDNS TXT 記錄

在另一個終端機中設定 TXT 記錄:

# 設定 TXT 記錄用於 DNS 挑戰
curl "https://www.duckdns.org/update?domains=ithome-rancher&token=your-duckdns-token&txt=ABC123def456GHI789jkl012MNO345pqr678STU901vwx"

# 預期回應:OK

驗證 TXT 記錄

# 確認 TXT 記錄已生效
dig TXT _acme-challenge.ithome-rancher.duckdns.org

# 或使用 nslookup
nslookup -type=TXT _acme-challenge.ithome-rancher.duckdns.org

確認 TXT 記錄生效後,回到 certbot 終端機按 Enter 繼續。

憑證申請成功

成功後會看到類似訊息:

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/ithome-rancher.duckdns.org/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/ithome-rancher.duckdns.org/privkey.pem
This certificate expires on 2025-11-21.
These files will be updated when the certificate renews.

NEXT STEPS:
- This certificate will not be renewed automatically. Autorenewal of --manual certificates requires the use of an authentication hook script (--manual-auth-hook) but one was not provided. To renew this certificate, repeat this same certbot command before the certificate's expiry date.

SSL 憑證檔案說明

Let's Encrypt 檔案結構

# 查看憑證檔案結構
sudo ls -la /etc/letsencrypt/live/ithome-rancher.duckdns.org/

# 檔案說明:
# cert.pem          # 你的憑證(只有主憑證)
# chain.pem         # 中繼憑證鏈
# fullchain.pem     # 完整憑證鏈(cert + chain)
# privkey.pem       # 私鑰
# README            # 說明檔案

PEM 格式說明

為什麼都用 .pem 副檔名?

PEM 格式使用不同的副檔名來區別檔案內容:

1. .pem

  • 含義:通用 PEM 格式檔案
  • 內容:可以包含任何東西(憑證、私鑰、憑證鏈等)
  • 使用場景:當檔案內容混合或不明確時

2. .crt 或 .cert

  • 含義:Certificate(憑證)
  • 內容:只包含憑證,不包含私鑰
  • 使用場景:明確表示這是憑證檔案

3. .key

  • 含義:Private Key(私鑰)
  • 內容:只包含私鑰
  • 使用場景:明確表示這是私鑰檔案

4. .csr

  • 含義:Certificate Signing Request(憑證簽署要求)
  • 內容:憑證申請檔案

Let's Encrypt 統一使用 .pem 副檔名,但用檔名前綴來區別:

  • cert = 憑證
  • chain = 憑證鏈
  • fullchain = 完整憑證鏈
  • privkey = 私鑰

現代加密演算法說明

重要提醒:Let's Encrypt 現在預設使用 ECDSA(橢圓曲線數位簽名演算法)而非傳統的 RSA 演算法。

ECDSA vs RSA 比較:

  • ECDSA:更小的金鑰長度、更快的運算速度、更安全
  • RSA:傳統演算法、較大的金鑰長度、運算較慢

這就是為什麼會看到 Not an RSA key 錯誤!

你可以用以下指令確認憑證類型:

# 檢查憑證使用的演算法
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -text -noout | grep "Public Key Algorithm"

# 檢查私鑰類型
sudo openssl pkey -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/privkey.pem -text -noout | head -5

憑證驗證與測試

查看憑證資訊

# 查看憑證詳細資訊
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -text -noout

# 查看憑證有效期(最重要!)
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -noout -dates
# 輸出範例:
# notBefore=Aug 23 00:00:00 2025 GMT
# notAfter=Nov 21 23:59:59 2025 GMT

# 查看憑證主體和頒發者
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -noout -subject -issuer

# 驗證憑證與私鑰匹配
# 注意:Let's Encrypt 現在使用 ECDSA 而非 RSA,要用 pkey 指令
sudo openssl x509 -noout -pubkey -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem > /tmp/cert_pubkey.pem
sudo openssl pkey -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/privkey.pem -pubout > /tmp/priv_pubkey.pem

# 比較兩個公鑰檔案,如果沒有輸出就表示匹配
diff /tmp/cert_pubkey.pem /tmp/priv_pubkey.pem
echo "如果上面沒有任何輸出,表示憑證和私鑰配對正確!"

# 清理暫存檔案
rm -f /tmp/cert_pubkey.pem /tmp/priv_pubkey.pem

常見驗證問題排除

1. 如果看到 "Not an RSA key" 錯誤

這個錯誤很常見,但完全正常!原因如下:

演算法變遷:

  • 傳統 SSL 憑證:使用 RSA 演算法(較舊、較慢、金鑰較大)
  • 現代 Let's Encrypt:使用 ECDSA 演算法(更安全、更快、金鑰較小)

為什麼會出錯?

# 錯誤做法:使用 RSA 專用指令
openssl rsa -in privkey.pem -check
# 錯誤訊息:Not an RSA key

# 原因:ECDSA 私鑰不是 RSA 格式,所以 rsa 指令無法處理

正確做法:

# 使用通用的 pkey 指令(支援所有演算法)
sudo openssl pkey -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/privkey.pem -check

# pkey 可以處理:RSA、ECDSA、Ed25519 等各種演算法

ECDSA 的優勢:

  • 256-bit ECDSA ≈ 3072-bit RSA(安全性相同但金鑰更小)
  • 運算速度更快
  • 憑證檔案更小
  • 現代瀏覽器完全支援

2. 檢查憑證鏈結構

# 檢查憑證內容和格式
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/fullchain.pem -text -noout | grep -E "Subject:|Issuer:|Not Before|Not After"

# 檢查憑證鏈中有幾個憑證
sudo cat /etc/letsencrypt/live/ithome-rancher.duckdns.org/fullchain.pem | grep -c "BEGIN CERTIFICATE"
echo "上面的數字應該是 2(表示有你的憑證和中繼憑證)"

# 檢查憑證序號和指紋
sudo openssl x509 -in /etc/letsencrypt/live/ithome-rancher.duckdns.org/cert.pem -noout -serial -fingerprint

今日總結與明日預告

今天我們成功為數位牧場安裝了安全鎖!透過 Let's Encrypt 免費服務,我們取得了有效的 SSL 憑證,並完成了基本的設定與驗證。

重點回顧:

  • 了解 Let's Encrypt 免費 SSL 憑證服務
  • 安裝 Certbot 客戶端工具
  • 使用 DNS 挑戰模式申請 SSL 憑證
  • 理解 PEM 格式憑證檔案結構
  • 完成憑證驗證與測試

明天我們將進入第二週的重頭戲,開始建置網路基礎設施並準備部署 RKE2 管理叢集。在此之前,我們需要先完成網路連通性的全面驗證!


💡 牧場主小提示:Let's Encrypt 憑證有效期只有 90 天,但這是故意的設計!短期憑證鼓勵自動化更新,反而比傳統一年期憑證更安全。記住,安全防護就像牧場的柵欄,要定期維護才能確保安全!


上一篇
Day 7: 外部網域服務建置 - DuckDNS 免費域名設定
下一篇
Day 9: RKE2 管理叢集部署實戰
系列文
牧場主的 K8s 放牧日記22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言